package practiceProjects.matrixRain;

/**
 * @Project ：learn_java
 * @File ：MatrixRain.java
 * @IDE ：IntelliJ IDEA
 * @Author ：豆包
 * @Date ：2025/4/17 16:37
 * @Description ：运行效果很差，终端看不清有什么字符，太快了。
 */


import java.util.Random;

public class MatrixRain {
    private static final int WIDTH = 80;  // 控制台宽度（字符数）
    private static final int HEIGHT = 25; // 控制台高度（字符行）
    private static final int[] COLORS = {32, 36, 34, 35, 33}; // 绿/青/蓝/紫/黄
    private static final Random RANDOM = new Random();

    static class RainDrop {
        int x;          // 列位置
        int y;          // 当前行
        int speed;      // 下落速度（1-3）
        int life;       // 存活周期（控制渐隐）

        RainDrop(int x) {
            this.x = x;
            this.y = -RANDOM.nextInt(HEIGHT);
            this.speed = RANDOM.nextInt(2) + 1;
            this.life = RANDOM.nextInt(5) + 3;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        RainDrop[] drops = new RainDrop[WIDTH];
        for (int i = 0; i < WIDTH; i++) {
            drops[i] = new RainDrop(i);
        }

        while (true) {
            // 清屏 + 定位到左上角
            System.out.print("\033[H\033[2J");

            for (int y = 0; y < HEIGHT; y++) {
                for (int x = 0; x < WIDTH; x++) {
                    RainDrop drop = drops[x];

                    // 绘制字符尾迹（渐隐效果）
                    if (y < drop.y && y > drop.y - drop.life) {
                        int alpha = (drop.y - y) * 25;
                        System.out.printf("\033[38;2;0;%d;0m%s", alpha, "▒");
                    }

                    // 绘制当前字符
                    if (y == drop.y) {
                        int color = COLORS[RANDOM.nextInt(COLORS.length)];
                        System.out.printf("\033[%dm%s", color, getRandomChar());
                        drop.y += drop.speed;

                        // 重置雨滴
                        if (drop.y >= HEIGHT) {
                            drops[x] = new RainDrop(x);
                        }
                    } else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }

            Thread.sleep(50); // 控制动画速度
        }
    }

    private static char getRandomChar() {
        int type = RANDOM.nextInt(3);
        switch (type) {
            case 0: return (char) (RANDOM.nextInt(26) + 'A'); // 大写字母
            case 1: return (char) (RANDOM.nextInt(26) + 'a'); // 小写字母
            default: return (char) (RANDOM.nextInt(10) + '0'); // 数字
        }
    }
}
